
#ifndef _BASIC_D_LAYOUTVM_H_
#define	_BASIC_D_LAYOUTVM_H_

#include "DIVA_VM.h"
#include <map>
#include "Ly_influence_area.h"
#include "Dynamic_Dialog.h"
#include "VMPositonTable.h"

using namespace std;

class Basic_Dynamic_lyvm{
protected:
	Dynamic_Dialog _ddlg;
	Ly_influence_area* _area;
	//這應該是要記錄所有範圍內VM的初始化的狀態,現在只記錄位置,待修改
	//vector<Vector3> _record; 
	string _name;
	bool _flag;
	positionmap _record;
public:
	inline bool getFlag() { return _flag;}
	inline void setFlag(bool flag) { this->_flag = flag;}
	inline string getName() { return _name;};
	inline void setName(string name) { this->_name = name;}
	inline Ly_influence_area* getArea() {return this->_area;}
	inline positionmap getPositionRecord() {return this->_record;}
	void clearDialog();
	
	//加入沒有需要使用者輸入的純敘述文字
	void addDescript(LPCSTR dscpt);
	//paraType用來防止錯誤的輸入
	void addParameter(LPCSTR paraName, string paraType, LPCSTR default_value);
	string getParameter(string paraName);
	void doLayout(DIVA_VM* startVM);
	void setChanges();
	void isAppliedToTargetVM(DIVA_VM*);
	virtual void initial(DIVA_VM*);
	virtual void showDialog();
	virtual void setupParameters() = 0;
	virtual void setupDialog() = 0;
	virtual string getDescription() = 0;
	/*
		為了spring layout所需才加入第二個預設參數 ,
		spring layout原理是先產生被拖曳(VM)的彈簧力 , 然後在每次更新畫面時(behavior)
		再即時產生其他的彈簧力 , 至於binary tree用不到第二個參數 , 而spring layout用不到第一個參數
	*/
	virtual void layout(std::vector<DIVA_VM*> vms,DIVA_VM* movedVM = NULL) = 0;
};
#endif 
